#include <ctime>
#include "igslib_iutil.h"

namespace igslib
{
    namespace util_sample
    {
        /*!
         * It demostrates how to get digest of a serialized buffer.
         */
        static void GetDigest()
        {
            const size_t buf_size = 1024;
            std::vector<unsigned char> buf;
            for ( int i = 0 ; i < buf_size ; ++i )
            {
                buf.push_back(i);
            }
            auto digest = util::GetDigest(buf);
            for(auto& each:digest)
            {
                util::Log("%02x ",each);
            }
            util::Log("\n");
        }
        /*!
         * It demostrates how to do simple crypto functions.
         */
        static void Crypto()
        {
            const size_t buf_size = 16;
            std::vector<unsigned char> buf;

            util::Log("%s> plain=",__func__);
            for ( int i = 0 ; i < buf_size ; ++i )
            {
                buf.push_back(i);
                util::Log("%02x ",buf[i]);
            }
            util::Log("\n");

            const size_t key_size = 16;
            std::vector<unsigned char> key;
            util::Log("%s> key=",__func__);
            for ( int i = 0 ; i < key_size ; ++i )
            {
                key.push_back(0xa5+i);
                util::Log("%02x ",key[i]);
            }
            util::Log("\n");

            auto encrypted = util::SymmetricEncrypt(key,buf);
            util::Log("%s> encrypted=",__func__);
            for(auto& each:encrypted)
            {
                util::Log("%02x ",each);
            }
            util::Log("\n");

            auto decrypted = util::SymmetricDecrypt(key,encrypted);
            util::Log("%s> decrypted=",__func__);
            for(auto& each:decrypted)
            {
                util::Log("%02x ",each);
            }
            util::Log("\n");
        }
        static void GetElapsedMilliseconds()
        {
            double first_ems = util::GetElapsedMilliseconds(); // first elapsed milliseconds
            util::Log("%s> first_ems=%g\n",__func__,first_ems);
            while(true)
            {
                int khb = util::KbHit();
                if (khb == 27)
                {
                    break;
                }
                else if (khb == 10)
                {
                    double ems = util::GetElapsedMilliseconds();
                    util::Log("%s> elapsed ms=%g\n",__func__,ems);
                }
            }
        }
    };
};
